# -*- coding: UTF-8 -*-
import sys

sys.path.append("../Objets-Ali")
import batiment
import entite

class Action():
    def __init__(self, parent, frame, entiteId, systemeId, planeteId):
        self.parent = parent
        self.frame = frame
        self.entiteId = entiteId
        self.systemeId = systemeId
        self.planeteId = planeteId    


    def effectuerAction(self):
        pass
    
    #Recherche et retourne l'entite concernee avec son id
    def chercherEntite(self):
        for entite in parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].listeEntites:
            if entite.Id == self.entiteId:
                return entite
            
    def chercherPlanete(self):
        for planete in self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes:
            if planete.ID == self.planeteId:
                return planete
    def chercherSysteme(self):
        return self.parent.galaxie.listeSystemes[self.systemeId]

            
    def verifierRessources(ressourcesTotal,cout):
        
        compteur = 0
        
        valide = True
        
        for prix in cout:
            
                if ressourcesTotal[compteur] - prix >= 0:
                    
                    
                    compteur = compteur + 1
                
                else:
                    valide = False
                    break
        
        if(valide):
            return True
        else:
            return False
            
            
           
class ActionDeplacement(Action):
    def __init__(self, parent, frame, entiteId, systemeId, planeteId, xFinal, yFinal, zFinal):
        Action.__init__(self, parent, frame, entiteId, systemeId, planeteId)
        self.xFinal = xFinal
        self.yFinal = yFinal
        self.zFinal = zFinal
        
    def effectuerAction(self):
        if self.planeteId == -1:
            entiteCourante = self.parent.galaxie.listeSystemes[self.systemeId].trouverEntiteParId(self.entiteId)
        else:
            entiteCourante = self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].trouverEntiteParId(self.entiteId)
        
        if entiteCourante:
            prochaineAction = entiteCourante.deplacement(self.xFinal, self.yFinal, self.zFinal) #Liste des parametres retournes par la fonction mouvement
            
            if prochaineAction:
                entiteCourante.posX = prochaineAction[4]
                entiteCourante.posY = prochaineAction[5]
                entiteCourante.posZ = prochaineAction[6]
                
                self.frame = self.frame + 1
                
                entiteCourante.enDeplacement = True
                
                self.parent.parent.ajouterOuModifierAction(self.parent.parent.actionsAFaire, self)
                
            else:
                entiteCourante.enDeplacement = False
                if self.planeteId != -1:
                    self.parent.unitesAVerifierCollisions.append([entiteCourante, self.systemeId, self.planeteId])

class ActionAttaquer(Action):
    def __init__(self, parent, frame, entiteId, targetId, systemeId, planeteId):
        Action.__init__(self, parent, frame, entiteId, systemeId, planeteId)
        self.targetId = targetId
        
    def effectuerAction(self):
        entiteCourante = self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].trouverEntiteParId(self.entiteId)
        entiteTarget = self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].trouverEntiteParId(self.targetId)
        
        if entiteCourante and entiteTarget:
            frameProchaineAction = entiteCourante.attaquer(self.parent, entiteTarget, self.frame)
            
            if frameProchaineAction: 
                self.frame = frameProchaineAction
                self.parent.parent.ajouterOuModifierAction(self.parent.parent.actionsAFaire, self)
            
            if entiteTarget and entiteTarget.nbrVies <= 0:
                del self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].listeEntites[self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].listeEntites.index(entiteTarget)]
                
            self.parent.unitesAVerifierCollisions.append([entiteCourante, self.systemeId, self.planeteId])
                
class ActionSortirPlanete(Action):
    def __init__(self, parent, frame, entiteId, systemeId, planeteId):
        Action.__init__(self, parent, frame, entiteId, systemeId, planeteId)
        
    def effectuerAction(self):
        xPlanete = self.chercherPlanete().posX
        yPlanete = self.chercherPlanete().posY
        entiteCourante = self.parent.galaxie.listeSystemes[self.systemeId].listePlanetes[self.planeteId].trouverEntiteParId(self.entiteId)
        self.chercherPlanete().listeEntites.remove(entiteCourante)
        if((xPlanete - 50) < 50):
            entiteCourante.posX = (xPlanete + 50)
        else:
            entiteCourante.posX = (xPlanete - 50)
        entiteCourante.posY = yPlanete
        self.chercherPlanete().systemeParent.listeEntites.append(entiteCourante)

class ActionEntrerPlanete(Action):
    def __init__(self, parent, frame, entiteId, systemeId, planeteId):
        Action.__init__(self, parent, frame, entiteId, systemeId, planeteId)
        
    def effectuerAction(self):
        entiteCourante = self.parent.galaxie.listeSystemes[self.systemeId].trouverEntiteParId(self.entiteId)
        self.parent.galaxie.listeSystemes[self.systemeId].listeEntites.remove(entiteCourante)
        entiteCourante.posX = 100
        entiteCourante.posY = 100
        entiteCourante.posZ = 0
        self.chercherPlanete().listeEntites.append(entiteCourante)
    
#classe pr creer         
class ActionCreerUnite(Action):
    def __init__(self, parent, frame, entiteId, systemeId, planeteId, posX, posY, posZ, rallyX, rallyY, rallyZ, type, nomJoueur):
        Action.__init__(self, parent, frame, entiteId, systemeId, planeteId)
        
        
        self.posX = posX
        self.posY = posY
        self.posZ = posZ
        self.rallyX = rallyX
        self.rallyY = rallyY
        self.rallyZ = rallyZ
        self.type = type
        self.nomJoueur=nomJoueur
        
        #Ali: cette partie la est complete
    def effectuerAction(self):
        
        planet = self.chercherPlanete()
        
        if self.type == "Tank":
            self.tank = entite.Tank(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)
            planet.listeEntites.append(self.tank)
            
        if self.type == "Vaisseau":
            self.vaisseau = entite.Vaisseau(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)
            planet.listeEntites.append(self.vaisseau)
            
        if self.type == "Explorateur":
            self.explorateur = entite.Explorateur(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)
            planet.listeEntites.append(self.explorateur)
            
        if self.type == "Transporteur":
            self.transporteur = entite.Transporteur(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)            
            planet.listeEntites.append(self.transporteur)
            
        if self.type == "Fregate":
            self.fregate = entite.Fregate(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)            
            planet.listeEntites.append(self.fregate)
            
        if self.type == "Colonisateur":
            self.colonisateur = entite.Colonisateur(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)            
            planet.listeEntites.append(self.colonisateur)
                        
        if self.type == "Croiseur":
            self.croiseur = entite.Croiseur(self.posX,self.posY,self.posZ, self.nomJoueur, self.entiteId)           
            planet.listeEntites.append(self.croiseur)
            
        monAction = ActionDeplacement(self.parent, self.frame+1, self.entiteId, self.systemeId, self.planeteId, self.rallyX, self.rallyY, self.rallyZ)
            
        self.parent.parent.ajouterOuModifierAction(self.parent.parent.actionsAFaire, monAction )
       
            
class ActionCreerBatiment(Action):
    def __init__(self,parent,frame, entiteId,systemId, planeteId, Btype, posX, posY, posZ, nomJoueur):
        Action.__init__(self,parent, frame, entiteId, systemId, planeteId)
        
        self.type = Btype
        self.posX = posX
        self.posY = posY
        self.posZ = posZ
        self.nomJoueur=nomJoueur
        
    def effectuerAction(self):
        #nouveauId = self.genererId()
             
        planet = self.chercherPlanete()
        if self.type == "Mine":
            self.mine = batiment.Mine("Mine", "batiment", 
               60, 60, 60, self.posX, self.posY, self.posZ, 
               self.nomJoueur,100,self.entiteId)
            
            planet.listeEntites.append(self.mine)
        if self.type == "Habitation":
            self.habitation = batiment.Habitation("Habitation", "batiment", 
               60, 60, 60, self.posX, self.posY, self.posZ, 
               self.nomJoueur,100,self.entiteId)

            planet.listeEntites.append(self.habitation)
            
        if self.type == "Caserne":
            self.caserne = batiment.Caserne("Caserne", "batiment", 
               60, 60, 60, self.posX, self.posY, self.posZ, 
               self.nomJoueur,100,self.entiteId)
           
            
            planet.listeEntites.append(self.caserne)
            
        elif self.type == "Tour":
            self.tour = batiment.Tour("Tour","batiment", 
               60, 60, 60, self.posX, self.posY, self.posZ, 

               self.nomJoueur, 50, self.entiteId, 3, 10)
            
            
            planet.listeEntites.append(self.tour)
            
        elif self.type == "Usine":
            self.usine = batiment.Usine("Usine", "batiment",60 , 60, 60, self.posX,
                         self.posY, self.posZ, self.nomJoueur,100,self.entiteId)
            
            planet.listeEntites.append(self.usine)
            
            
        elif self.type == "Station Spatiale":
            self.station = batiment.StationSpatiale("Station Spatiale", "batiment",60, 60, 60, self.posX,
                         self.posY, self.posZ,self.nomJoueur,100,self.entiteId)
            
            self.chercherSysteme().listeEntites.append(self.station)   
            
        
        elif self.type == "Ferme":
            self.ferme = batiment.Ferme("Ferme", "batiment",60, 60, 60,self.posX,
                         self.posY, self.posZ, self.nomJoueur,100,self.entiteId)
            
            planet.listeEntites.append(self.ferme)
            
        
        elif self.type == "Centre de Recherche":
            self.centreRecherche = batiment.CentreRecherche("Centre de Recherche", "batiment",60, 60, 60, self.posX,
                         self.posY, self.posZ, self.nomJoueur,100,self.entiteId)
            
            planet.listeEntites.append(self.centreRecherche)
            
        elif self.type == "Centre de Communication":
            self.centreCommunication = batiment.CentreCommunication("Centre de Communication", "batiment",60, 60, 60, self.posX,
                         self.posY, self.posZ, self.nomJoueur,100,self.entiteId)
            
            planet.listeEntites.append(self.centreCommunication)
            
class ActionChangerStatus(Action):
    def __init__(self,parent, frame, entiteId, systemId, planeteId, nomJoueur1, nomJoueur2, newStatus):
        Action.__init__(self,parent, frame, entiteId, systemId, planeteId)
        self.nomJoueur1 = nomJoueur1
        self.nomJoueur2 = nomJoueur2
        self.newStatus = newStatus
        
    def effectuerAction(self):
        self.parent.joueur.modifierStatus(self.nomJoueur1,self.nomJoueur2,self.newStatus)
        

#Incrémente le compteur de 1 à chaque frame, pour compter le temps de création d'une unité
class ActionCompteur(Action):  
    def __init__(self,parent,frame, entiteId, systemId, planeteId, batiment, unite, posX, posY, posZ ):
        Action.__init__(parent, frame, entiteId, systemId, planeteId)
        
        self.batiment = batiment
        self.unite = unite
        self.posX = posX
        self.posY = posY
        self.posZ = posZ
        
        def effectuerAction(self):
            
            self.batiment.incrementer(self.batiment.compteur)
            
            #si le compteur = au temps de creation de l'unite
            if self.compteur == self.unite.tempsCreation:
                
                #si construction d'unite
                if self.unite != None:
                    
                    
                    monAction = actionCreerUnite(client.Controleur, self.frame, self.entiteId, self.systemeId, self.planeteId,self.posX, self.posY, self.posZ, self.unite.nom)
                    
                else:
                    
                    monAction = actionCreerBatiment(client.Controleur, self.frame, self.entiteId, self.systemeId, self.planeteId, batiment.nom, self.posX, self.posY, self.posZ, None)
                
                #envoie laction au controleur pour qu'il l'execute ce qui crée l'unite ou un batiment
                client.Controleur.ajouterOuModifierAction(client.Controleur.ActionAFaire, monAction )
            
            else:
                
                if self.unite != None:
                
                    batiment.construire(self.unite, self.posX, self.posY, self.posZ)
        
